The notion of virtualization entails the virtualizing of computer hardware such that multiple operating systems, each of which may be contained in a separate partition, can run on a single piece of hardware. Virtualizing software abstracts the hardware in various ways such that diverse operating systems interact with the software, and the software in turn interacts with the hardware.
Most virtualization systems contain a single Virtual Machine Monitor (VMM) software. In some arrangements, this VMM is called a “hypervisor.” A hypervisor is designed to run directly on hardware. As such, it is the ultimate arbiter of how the hardware is used. For this reason, in the general case, there can be only one hypervisor on a machine (on one set of hardware). A hypervisor allows multiple “guest” operating systems (OSs) or “guests” for short, to run on a system concurrently.
A VMM or hypervisor can be designed with certain goals in mind. Engineers must make trade-offs between security, complexity, flexibility, performance, and so on. Some VMMs or hypervisors allow interaction with the guests through a programmatic interface. As with any interface, versioning becomes important. A guest written for one version of a hypervisor may be incompatible with a different version of the hypervisor.
Thus, there are situations where it would be useful to run multiple copies of a hypervisor on a single machine. One version, for example, could be extremely simple and provide high security guarantees, and another version could provide more complex and intricate features. Such multiple versions could run side-by-side.
Unfortunately, this is not feasible with today's designs because there can be only one hypervisor on the machine. One traditional approach to this problem is to use recursive virtualization whereby hypervisors are “nested.” A single “real” hypervisor sits at the base, and one or more second-level hypervisors run above it. This arrangement has the disadvantage of poor performance. Because the second-level hypervisors were written assuming they have direct access to the hardware, they will not perform as well. In short, with each additional level of nested hypervisors, the performance of the overall virtualized system becomes geometrically worse off.
Also, many processors provide hardware support for one level of virtualization, but they rarely provide support for more than one. Thus, from a hardware point of view, it becomes difficult to implement multiple hypervisors on a single physical machine. Thus, it would be advantageous to provide mechanisms for running virtualizing software directly on hardware such that multiple versions of the software are running directly on the hardware at the same time.